/*This file is part of Sandbox.

Sandbox is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License.

Sandbox is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Sandbox.  If not, see <http://www.gnu.org/licenses/>.

For contact, see the About page of my blog: <http://mygeekyware.wordpress.com/>.*/


#include <iostream>
#include "controlador.h"
#include "definiciones.h"
#include <SDL/SDL.h>
#include <SDL/SDL_events.h>
#include "particula.h"
#include <math.h>

using namespace std;

void controlador::Oil(particula matriz[400][220], int x, int y) {
    //Make the vertical velocity to go to +1 if it's not
    if (matriz[x][y].vy <= 0)
        matriz[x][y].vy++;
    //Make the horizontal speed to go to 0 if it's not 0
    if (matriz[x][y].vx >0)
        matriz[x][y].vx--;
    else if (matriz[x][y].vx < 0)
        matriz[x][y].vx++;
    //Gather data from object
    int vx = matriz[x][y].vx;
    int vy = matriz[x][y].vy;


    if (x+vx >= 0 && x+vx < 400 && y+vy >= 0 && y+vy < 220) {
        if (matriz[x+vx][y+vy].tipo == 0) {
            Copy(matriz, x, y, x+vx, y+vy);
            matriz[x][y].tipo = 0;
            matriz[x][y].empuje = 0;
            matriz[x+vx][y+vy].update = false;
            //return ;
        }
        else if (vy == 1 && vx == 0) {
            bool react;
            if (matriz[x][y+1].tipo > OIL) {
                react = chkReaction(OIL, matriz[x][y+1].tipo);
            }
            else
                react = chkReaction(matriz[x][y+1].tipo, OIL);
            if (!react) {
                if (matriz[x][y].peso > matriz[x][y+1].peso && matriz[x][y].contador == 2) {
                    Swap(matriz, x,y,x,y+1);
                    matriz[x][y+1].update = false;
                    matriz[x][y].contador = 0;
                    //return;
                }
                else if (matriz[x][y].peso > matriz[x][y+1].peso && matriz[x][y].contador < 2) {
                    matriz[x][y].contador++;
                    return;
                }
                else {
                    if (contadorgeneral%2 == 0) {
                        if (matriz[x+1][y+1].tipo == 0 && matriz[x+1][y].tipo == 0) {
                            Copy(matriz, x, y, x+1, y);
                            matriz[x+1][y].update = false;
                            matriz[x][y].tipo = 0;
                            matriz[x][y].empuje = 0;
                            //return;
                        }
                        else if (matriz[x-1][y+1].tipo == 0 && matriz[x-1][y].tipo == 0) {
                            Copy(matriz, x, y, x-1, y);
                            matriz[x][y].tipo = 0;
                            matriz[x][y].empuje = 0;
                            //return;
                        }
                    }
                    else {
                        if (matriz[x-1][y+1].tipo == 0 && matriz[x-1][y].tipo == 0) {
                            Copy(matriz, x, y, x-1, y);
                            matriz[x][y].tipo = 0;
                            matriz[x][y].empuje = 0;
                            //return;
                        }
                        else if (matriz[x+1][y+1].tipo == 0 && matriz[x+1][y].tipo == 0) {
                            Copy(matriz, x, y, x+1, y);
                            matriz[x+1][y].update = false;
                            matriz[x][y].tipo = 0;
                            matriz[x][y].empuje = 0;
                            //return;
                        }
                    }
                    //Aqui hacer otro else para ver si en algun lado hay una particula con la que reaccione
                }
            }
            else
            {
                //AQUI LAS REACCIONES
            }
        }
    }

    //PUSH reactions
    //To lo de empujes
    if (matriz[x][y].empuje != 0) {
        if (matriz[x][y].empuje == 4) {
            if (matriz[x-1][y].tipo == 0) {
                Copy(matriz, x,y,x-1,y);
                matriz[x][y].tipo = 0;
                matriz[x][y].empuje = 0;
                //return;
            }
            else if (matriz[x-1][y].peso < matriz[x][y].peso) {
                Swap(matriz,x,y,x-1,y);
            }
        }
        else if (matriz[x][y].empuje == 6) {
            if (matriz[x+1][y].tipo == 0) {
                Copy(matriz, x,y,x+1,y);
                matriz[x+1][y].update = false;
                matriz[x][y].tipo = 0;
                matriz[x][y].empuje = 0;
                //return;
            }
            else if (matriz[x+1][y].peso < matriz[x][y].peso) {
                Swap(matriz, x,y,x+1,y);
                matriz[x+1][y].update = false;
            }
        }
        else {
            if (contadorgeneral%2 == 0) {
                if (matriz[x-1][y].tipo == 0) {
                    Copy(matriz, x,y,x-1,y);
                    matriz[x][y].tipo = 0;
                    matriz[x][y].empuje = 0;
                    //return;
                }
                else if (matriz[x+1][y].tipo == 0) {
                    Copy(matriz, x,y,x+1,y);
                    matriz[x+1][y].update = false;
                    matriz[x][y].tipo = 0;
                    matriz[x][y].empuje = 0;
                    //return;
                }
            }
            else {
                if (matriz[x+1][y].tipo == 0) {
                    Copy(matriz, x,y,x+1,y);
                    matriz[x+1][y].update = false;
                    matriz[x][y].tipo = 0;
                    matriz[x][y].empuje = 0;
                    //return;
                }
                else if (matriz[x-1][y].tipo == 0) {
                    Copy(matriz, x,y,x-1,y);
                    matriz[x][y].tipo = 0;
                    matriz[x][y].empuje = 0;
                    //return;
                }
            }
        }
    }

    //Se le da empuje después de ver si el empuje les afecta
    //Push for having something above applied after checking if they should move because of push
    if (y>0) {
        if (matriz[x][y-1].tipo!=0) {
            if (y == 219) {
                matriz[x][y].empuje = 1;
            }
            else if (matriz[x][y+1].tipo != 0){
                bool react;
                if (matriz[x][y+1].tipo > OIL) {
                    react = chkReaction(OIL, matriz[x][y+1].tipo);
                }
                else
                    react = chkReaction(matriz[x][y+1].tipo, OIL);
                if (!react) {
                    matriz[x][y].empuje = 1;
                }
            }
        }
    }
    if (x>0) {
        if (matriz[x+1][y].tipo != 0) {
            matriz[x][y].empuje = 4;
        }
    }
    if (x<399) {
        if (matriz[x-1][y].tipo != 0) {
            if (matriz[x][y].empuje == 4) {
                //Darle 4 ó 6 dependiendo de a que lado haya más peso.
                if (matriz[x+1][y].peso > matriz[x-1][y].peso) {
                    matriz[x][y].empuje=4;
                }
                else if (matriz[x+1][y].peso < matriz[x-1][y].peso) {
                    matriz[x][y].empuje = 6;
                }
                else {
                    matriz[x][y].empuje = 0;
                }
            }
            else
                matriz[x][y].empuje = 6;
        }
    }
}
